from abc import ABC, abstractmethod


class LocalSearchOperator(ABC):
    """局部搜索算子抽象基类"""

    @abstractmethod
    def __call__(self, solution, problem_instance, intensity):
        """
        通用局部搜索算子接口

        参数:
        solution: 当前解（问题特定的表示形式）
        problem_instance: 问题实例对象，包含问题特定信息和方法
        intensity: 搜索强度/迭代次数

        返回:
        improved_solution: 改进后的解
        improvement: 改进量（可选）
        """
        pass

    def is_applicable(self, problem_instance):
        """检查算子是否适用于给定的问题实例"""
        # 如果算子没有定义supported_problems，则默认适用
        if not hasattr(self, 'supported_problems'):
            return True
        return problem_instance.get_problem_type() in self.supported_problems

# 注册所有算子的字典
OPERATORS_REGISTRY = {}


def register_operator(name, operator_class):
    """注册局部搜索算子"""
    OPERATORS_REGISTRY[name] = operator_class


def get_operator(name):
    """获取已注册的局部搜索算子"""
    return OPERATORS_REGISTRY.get(name)


# 显式导出这些函数和类
__all__ = [
    'LocalSearchOperator',
    'register_operator',
    'get_operator',
    'OPERATORS_REGISTRY'
]

